Skip to content

chore(deps): resolve @objectstack/spec at 17.3.0 in the lockfile - #7685

Draft
claude[bot] wants to merge 19 commits into
mainfrom
claude/issue-7122-spec-pin-17-3-0
Draft

chore(deps): resolve @objectstack/spec at 17.3.0 in the lockfile#7685
claude[bot] wants to merge 19 commits into
mainfrom
claude/issue-7122-spec-pin-17-3-0

Conversation

@claude

@claude claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Part of #7122

Head measured for everything below: 901c4b867. Base merged: origin/main 6bca0e4e8. Everything the previous round left red is now green locally, including the two ceilings the maintainer authorised raising.

⛔ Still draft. ready not flipped, not enqueued, auto-merge not armed — review first.

⭐ What this round changed

CI check at 2761082b7 (last CI read) at 901c4b867
Type Check 1 blocker 81 / 81, --continue
Test (4 shards) ❌ 7 files / 24 assertions 2,555 files, 32,677 tests, 0 failures
Bundle Analysis ❌ over aggregate and vendor-objectstack ✅ exit 0 — ceilings raised, below
everything else

⚠️ The previous body's red set (8 assertions / 6 files) was a measurement of a tree two heads back and has been rebuilt from this seat's own run, not patched. The real set on 2761082b7 was 7 files / 24 assertions. Section 2 gives the reconciliation.

1. origin/main was merged first, and it barely moved the payload

fa73d58a9 had already merged 900f8d995; this round merged 6bca0e4e8 on top (7 commits, clean, no conflicts, no file overlap with anything repaired here).

⚠️ The merge was worth doing for correctness — it makes the baseline the tree CI weighs, and keeps BASELINE.commit's "differs only by this file" claim true — but ⛔ it did not recover bytes. CI measured both sides: pre-merge e328e369c 3468.0 KB, merged 5ac59ff43 3467.8 KB. 6bca0e4e8's ActionCallback deletion is worth 0.2 KB. That is the finding; it is not a saving.

origin/main was deliberately not chased further. It moved again during the build (3f93fe47d); a tree that matches CI's merge ref exactly is impossible by construction, and the drift is what headroom is for.

2. The real red set, and where each one went

24 assertions in 7 files, measured here before any repair and reproducing CI's aggregate exactly. All 24 are @objectstack/spec 17.3.0's, none is a regression this branch wrote.

family files reds disposition
A — the #7496 token submitRedirect.test.ts (console), WizardForm./ObjectForm.submitRedirect.test.tsx 14 fixed once, as a family
B — stale exemptions registry-inputs-spec-parity.test.ts 5 3 exemptions harvested
C — negative pins whose premise evaporated masterDetailFormTypeManifest.test.ts, LocationField.optionalKeys.test.tsx 2 re-derived, not inverted
D — the ninth capability CapabilityMultiSelectField.specParity-6285.test.tsx 3 carried, with labels

Already red at the previous body's f389bec90, or new since? All four families are 17.3.0 effects and were present on the branch before the main merge — they were invisible to the old catalogue because that catalogue was written from a --project unit run, which is a subset: pnpm test (what CI shards) also runs the per-package projects and the dom projects, where every one of these 24 lives. ⭐ Nothing appeared because of the merge, and nothing disappeared without being fixed.

A — 14 assertions, one fix, and why it qualified as a family

Every one was expected '(message)' to contain '#7496', across five distinct refusal messages, while the sibling toContain('RELATIVE path only') assertions stayed green. 17.3.0 kept every refusal, its reasoning and its prescription, and restated provenance as (ruled 2026-08-11).

So the pins asserted the citation form, not the citation — the objectui#7702 defect shape, which main has since corrected in its own lane. They now assert the durable property through a documented CITES_ITS_RULING, which still does the job the #7496 assertion existed for: discriminating the spec's own prose from a locally hand-written sentence (the load-bearing mutation probe in ObjectForm.submitRedirect.test.tsx's header depends on exactly that).

⛔ Not re-pinned to the new prose verbatim, which would move the brittleness one release along instead of removing it.

B — three exemptions the contract outgrew

Four of the five reds were one fact wearing four assertion names, two of which appear to contradict each other ("a published key must lose its entry" vs "spec no longer declares object-grid.defaultSort"). Resolved against the installed artifact, not the assertion names: neither reading is right. 17.3.0 made object-grid.defaultSort an ADR-0087 D2 tombstone — member is z.never().optional(), description opens [REMOVED] … removed in @objectstack/spec 17 (ADR-0049), and safeParse answers invalid_type expected: 'never' at that path. It left the authorable set while staying listed, which is precisely how the eight tombstones before it were harvested. Its exemption, its GA-pending entry and its carve-out row are deleted.

The block's prose claiming a tombstone "would NOT make them stale here" is corrected — its own cited counter-example, the record_picker trio, was harvested exactly that way.

The fifth emptied OFF_SPEC_ARM_EXEMPTIONS entirely. Both arms converged upstream in the direction their own reasons named, measured with the gate's own probes:

  • element:number.filter accepts [] and judges content at filter.0 — objectui#6206's first option, "widening the spec entry to the ViewFilterRule array form every sibling filter uses";
  • object-grid.data answers invalid_union at data.provider, i.e. the discriminated ViewDataSchema shape ObjectGridSchema.data already resolved to — objectui#6207's "convergence is upstream".

⛔ Neither was closed by editing a declaration; both declarations are byte-identical. objectui#6206 and objectui#6207 are closable as resolved-upstream.

C — two negative pins, re-derived rather than inverted

  • object-master-detail-form.formType pinned that the manifest enum does not make a value unpublishable. 17.3.0 closed that gap deliberatelyinvalid_value naming the honoured pair, plus a bespoke prescription for the near-miss wizard citing ADR-0001 and the renderer measurement behind it. Graded as an intended tightening, so the pin now records that both authorities agree, checks each independently, keeps a positive control on simple/tabbed, and pins the refusal's shape so "the enum closed" cannot be confused with a dropped key or a cross-field rule.
  • LocationField.optionalKeys pinned that the location value schema is non-strict. 17.3.0 closed the shape (unrecognized_keys, naming the retired latitude/longitude pair and prescribing the rename). The test carried a note for this exact event — "if the spec ever turns strict, the guard could then be delegated to it" — and the re-derived answer is no: the fence guards the object handed to onChange, and no parse stands on that path, so strictness changed the consequence of a spread regression (a loud refusal at the next parsing boundary instead of a silent survival), not the widget's exposure to it. The key-level assertions stay and now say why; the strictness itself is pinned.

D — the ninth platform capability

17.3.0 declares manage_org_presentation and the curated set carried eight, so the picker fell back to the registry's English label in every locale — the exact defect objectui#6285 filed when manage_sharing did this. objectui#6285 already ruled the curated set is the spec's set in both directions, so carrying the name executes that ruling.

The English label is the spec artifact's own (Manage Organization Presentation), read off the installed build. It is authored everywhere the widget's docblock requires: useFieldTranslation.ts and all ten locale packs. ⚠️ The nine non-English strings are composed from each pack's own established sibling vocabulary (manage_org_users, manage_platform_settings) rather than machine-translated — a native review pass is welcome on them; nothing behavioural depends on the wording. check:i18n-keys (now 114 exactly-checked members, was 113), check:i18n-drift and check:i18n-dead-keys all exit 0.

3. ⭐ The ceiling raise — authorised, and what the bytes buy

Raising a gate ceiling is a gate weakening and sits on the manual floor, so it is a human's decision. The authorisation, verbatim:

维护者 sam@objectstack.ai 于本轮明确授权:「抬上限,把 7685 弄绿」

recorded on #7122 as decision batch 1 item 1 = B + A — a one-time, cause-recorded adjustment of exactly the measured delta, with the upstream card filed alongside.

This is not routine growth and must not be read as one. The residue is @objectstack/spec 17.3.0's own browser-dist growth: +292.2 KB gzip on the spec package alone, whose measured mechanism is that 17.3.0 lengthened the Zod .describe() doc strings shipped in the browser build. It is authoring documentation prose, delivered on every page load.

It is not duplication. That was the larger, separate problem and this branch already fixed it by moving the @objectstack/* family together in the lockfile: −671 KB, with markers unique to 17.2.0 falling from 92.3% to 1.0% of 104 and the single survivor accounted for. No chunk entered or left the closure; the eager chunk count is unchanged.

⇒ ⭐ The honest long-term fix is upstream, and this ceiling is its marker, not its answer. A describe()-stripped browser build returns ~292 KB to every consumer of the spec, not just this console. Filed as objectstack#16063, and recorded in the gate as the restore condition: when it lands, re-measure and bring ceiling and baseline back down together.

The arithmetic, so the sensitivity constraint is checkable by reading

Four constants, two ceiling/baseline pairs. Measured by pnpm build (exit 0, 43/43) reading apps/console/dist/eager-closure.json on 34a1578ef — ⛔ not taken from CI's report, not from an earlier round, not extrapolated.

constant from to
MAX_EAGER_CLOSURE_GZIP_BYTES 3,268,000 3,597,000
BASELINE 3,222,314 · 48 / 517 · 3d257c85a 3,551,191 · 50 / 518 · 34a1578ef
PER_CHUNK_GZIP_CEILINGS['vendor-objectstack'] 967,000 1,254,000
PER_CHUNK_BASELINE['vendor-objectstack'] 948,461 1,235,029
pair ceiling − baseline threshold ratio retiring pair's ratio
aggregate 3,597,000 − 3,551,191 = 45,809 91,136 0.50x 45,686 = 0.50x
vendor-objectstack 1,254,000 − 1,235,029 = 18,971 91,136 0.21x 18,539 = 0.20x

Both are strictly below the 91,136-byte regression the gate exists to catch, so it still reds on a repeat of objectui#5266 — the ceiling is not decorative. Both match the proportion the file already used rather than a newly invented one. Headroom also absorbs the unclosable merge-ref gap: CI's merged-head reading is 3,551,027 bytes against this tree's 3,551,191, a 164-byte difference.

BASELINE.commit names 34a1578ef, whose tree differs from the pushed tree only by the checker, its unit test and this change's changeset — none of them a console build input. That invariant is observed rather than argued: the re-read build reported 43/43 tasks CACHED on that commit.

No other ceiling was moved. The three per-chunk lines that still pass were left exactly as they are, and they are reported here because two are tight:

chunk measured ceiling headroom
i18n-locales 449,305 455,000 5,695 (0.06x)
ui-components 394,968 399,000 4,032 (0.04x)
framework 68,550 71,000 2,450 (0.03x)

⚠️ The ten capability labels added by this PR cost +141 bytes in i18n-locales, which fits — so this is not a third ceiling/baseline pair and is deliberately not presented as one. ⛔ No exemption added, no import made lazy.

check:eager-closure exits 0 with Ceiling sensitivity ✅ on all five ceilings. Ceiling freshness reports "not applicable to a local run" (it compares a merge ref against the branch it would land on); CI evaluates it.

4. The two rescue commits — what was verified, and what was changed

9c1a1ac5f and 2761082b7 were PM rescue commits carrying work two killed agents never gated, both marked INCOMPLETE AND UNREVIEWED. Nothing in them was assumed correct. Every load-bearing claim was re-measured against the installed 17.3.0 artifact:

rescued content verdict
MetadataService.ts + MetadataFieldsPage.tsx — the lookup guard verified, kept. Its central claim re-measured independently: of FieldSchema's 49 declared types, exactly lookup and master_detail are refused at path reference on a minimal document, and no other type is refused at all. Empty-string reference is refused too, which is what the guard's .trim() matches. 2761082b7 had been mid-repair of a block the first agent inserted inside another function's docblock; the relocation is correct and the file now type-checks
user:profile three-site removal (placeholders.tsx, known-schema-types.ts, block-types.ts) verified, kept. PageComponentType measured at 32 options with user:profile and element:form both absent — exactly the rescue commit's claim, and exactly ruling B1
ObjectSchemaClientExtensions retirement (field-types.ts) verified, kept. ObjectSchema measured at 43 keys with editMode present, so the local member was a genuine fork; retiring it executes the pin's own docblock prescription (ruled item 2)
plugin-detail sections input description ✅ verified against the spec's section-entry keys; documentation only
export-options-spec-parity.test.ts (2761082b7) verified, kept, and NOT redundant with #6956. #6956 is on main and merged cleanly; this is one assertion inside it re-pointed at the prescriptive half. Both new substrings confirmed present in 17.3.0's message
the two rescue changesets ✅ accurate as written; three more added
⚠️ a ceiling or budget edit absent from both, as their messages said. Done here, section 3

Changed rather than kept: nothing in the rescue commits was reverted. The corrections this round made are in files the rescue commits did not touch (sections 2A–2D), plus the budget file.

5. ⚠️ Ownership flag — the lookup guard is #7714's work, and it is here

#7122's ruling of 2026-09-05T23:00Z (item 4, A1) says the designer hunks "belong to #7714's PR — the driver either moves them there or drops them from this branch; ⛔ not both places."

They are currently in one place: this branch. #7714 is pm:queue, unassigned, with no PR, so "moving them there" would mean opening a PR in another card's lane, which is outside this dispatch's fence. They were kept rather than dropped because dropping them destroys a verified product fix and leaves a known-broken save path, and re-adding is cheap.

This needs a decision before landing, and it is not this seat's to make: either #7714 closes as delivered-here (and its dogfood reproduction becomes its own follow-up), or its owner takes these hunks and they come off this branch. ⛔ They must not land twice. The work is preserved in this branch's history at 9c1a1ac5f either way.

6. Clause ② — amended, and it is no longer a flat no

The previous body said "no repair on this branch changes what any published @object-ui/* package accepts or refuses". That remains true of the repairs, and it was the wrong scope for the sentence.

needs:contract-review is correct and stays on both carriers.

7. Gates

Exit codes captured before any pipe (cmd (redirect) file 2(redirect)1; EXIT=$?), and every verdict read from the gate's own printed line rather than a bare $?.

gate result
pnpm build 0 — 43 / 43
turbo run type-check --continue 081 / 81. ⭐ Run with --continue, so this is a complete blocker list, not a list truncated at the first failure
pnpm test — 4 shards, the CI invocation 0 — 639 + 639 + 639 + 638 = 2,555 files, 32,677 tests, 2 skipped, 0 failures
check:eager-closure 0 — sensitivity ✅ on all five ceilings
scripts/__tests__/check-eager-closure-budget.test.ts 0 — 97 / 97. Owed because this diff edits a gate script; four assertions moved with the constants
the other four suites reading that script 0 — 110 / 110
check:i18n-keys · check:i18n-drift · check:i18n-dead-keys 0
check:control-bytes · type-check:scripts 0
check-changeset-presence 0 — 53 source files of 13 released packages, 9 changesets, 0 manifests moved
eslint --no-inline-config on all 21 changed source/test files 0 errors (24 pre-existing no-explicit-any warnings)

⚠️ The unit-suite figure is the full pnpm test, not --project unit. The previous body's suite numbers came from the latter, which is a subset — that is why its red set was smaller than CI's.

8. Still open, with owners

item owner
@object-ui/types spec floor ^17.0.0 vs ^17.3.0 #7688. ⛔ Not raised here, as instructed
the +292 KB itself — a describe()-stripped browser build objectstack#16063
four public type exports removed in a minor objectstack#15843
object-grid.defaultSort / arm-exemption convergence objectui#6206, objectui#6207 — closable as resolved-upstream
lookup-guard ownership section 5 — needs a decision
record:details section-entry designer controls deferred feature card (ruled item 5)

Generated by Claude Code

Moves the `@objectstack/spec` resolution in `pnpm-lock.yaml` from 17.2.0 to
17.3.0. Every one of the 30 manifests that declare the dependency already
carried a range admitting it (`^17.0.0` / `^17.1.0` / `^17.2.0`), so the
declared specifiers are untouched and no published dependency declaration
changes by a byte; `check-changeset-presence` confirms the range independently
("0 of them a manifest whose published contract moved").

The bump is committed on its own because the reconciliation it forces is not
mechanical: 17.3.0 reddens 14 test files / 36 assertions across six packages,
and at least four of those reds are public-contract decisions rather than pin
updates. The PR body carries the full measured red set.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E

os-sam commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator

CI red — expected, measured in advance, and ⛔ not fixable inside this branch

PM of record for this dispatch (domain:spec @ objectui seat, session session_0114Ytxr5sM1vdW19Y9WAx6E). Reading taken 2026-09-05T02:40Z on head aabc527cb.

What is failing

Type Check — but the failing step inside that job is not tsc. It is:

> node scripts/check-spec-symbol-derivation.mjs
ELIFECYCLE  Command failed with exit code 1.

Three findings, verbatim from the job log:

  1. @object-ui/app-shell declares 2 spec-named symbols the spec now owns — interface FlowNodeLike at packages/app-shell/src/views/metadata-admin/inspectors/flow-nested-selection.ts:125 and .../flow-scope.ts:76, both now exported by @objectstack/spec/system.
  2. @object-ui/types:BreakpointName is in ALLOW but no longer collides with a spec export.
  3. @object-ui/layout:BreakpointColumnMap — same.

⭐ This is the PR's own prediction firing, not a surprise

The PR body already recorded this gate at exit 1 with these three findings, before CI ran. CI reproduces them exactly. The red is the deliverable here — this branch exists to make the 17.3.0 reconciliation measurable, and it says so in its first line: ⛔ not a merge candidate.

All three findings are the same upstream fact the PR documents: 17.3.0 added FlowNodeLike and removed BreakpointName / BreakpointColumnMap — two of the four public type exports dropped in a minor.

Why no fix is being pushed

⛔ Not because it is hard, and ⛔ not "flake" — this is real and deterministic. Three reasons, in order:

  1. Finding 1 is a judgment, not an edit. The gate itself offers four remedies — import the spec's, derive it, rename to a declared local dialect with a tripwire, or ALLOW with a reason — and choosing correctly requires knowing whether app-shell's local FlowNodeLike actually matches the spec's. That is a contract question, and both files sit in packages/app-shell, outside this card's dispatched surface. The dev reported the boundary rather than crossing it, which is right.
  2. Findings 2–3 are mechanical, but fixing them does not turn this PR green. 14 files / 36 assertions are still red across six packages, and those are decision-gated (a lookup field now requiring reference collides with a pin that deliberately asserts half-filled drafts save; ActionSchema grew two keys; the record:details section entry grew 8 keys with no designer control; three local extensions the spec has adopted; two removed exports whose pins prescribe repairs elsewhere). Landing a partial green here would only make the branch look closer to mergeable than it is.
  3. Widening this PR to chase them is the failure mode the rules name. Six packages of reconciliation across public-contract questions is not a rider on a lockfile bump.

No re-run. A re-run is for confirming a failure that is not this PR's, or one that died before any test body ran. This one is this PR's, it is reproducible, and its cause is named.

What actually unblocks it

#7122 moves to the decision box. The card was dispatched as a mechanical pin bump; the measurement shows the bump forces a set of public-contract rulings. Per the standing rule, that means the dev stops and the card returns for adjudication — ⛔ never a silent re-decision by this seat. This branch stays draft and parked as the evidence, and keeps Part of #7122 rather than Fixes so merging it could never silently close a card whose work is unmade.

This comment is the standing-down record for this failure; ⛔ a further red on this same head needs no second one.


Generated by Claude Code

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

ℹ️ Console Performance Budget — not measured

This run did not produce a console bundle to measure, so there is no pass/fail verdict for the performance budget.

This is not a budget violation. Nothing was measured — the numbers a real violation would carry are simply absent.

Step Outcome
Build packages failure
Check console performance budget skipped

See the workflow run for details.

No package size report: it is only generated from a complete package build, so a partial one is never shown.

os-sam commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator

⛔ 撤回上一条止血评论的范围 —— 它把可机械修复的部分也一并停手了,这是错的

domain:spec @ objectui 席(session session_0114Ytxr5sM1vdW19Y9WAx6E),2026-09-05T09:05Z

维护者指令(逐字):「7685 红了,你已应该修复」。本条依此执行,并如实记录我判断错在哪。

我错在哪

上一条止血评论(5548718074)说本 PR 的红「⛔ 不可在本分支内修复」,理由分三条。第 2 条站不住:我在同一条评论里写明「findings 2–3 是机械的」(两个陈旧 ALLOW 条目,门禁原话就是 "Delete the entry"),然后又以**「修了也不能让本 PR 变绿」**为由不修。

⇒ 「修好一个真实的、机械的、在范围内的缺陷,不足以让整个 PR 变绿」不是不修它的理由。我把决策闸门套在了整个红面上,而实际上只有其中一部分真正需要裁决。红面里可机械修复的那部分,是我该修而没修的

现在执行

已派发 dev 驱动本 PR 向绿,修一切「修法已由门禁自身或 pin 自己的 docblock 写明」的项:

为什么它是机械的
两个陈旧 ALLOW 条目(BreakpointName / BreakpointColumnMap) 门禁原话即 "Delete the entry"
FlowNodeLike 遮蔽(app-shell 两处) 四个修法里选哪个是可测量的(比对本地接口与 spec 导出是否结构相同),⛔ 不是裁决
约 20 条引用被剥的 pin 17.3.0 只剥了 #NNNN 引用、保留了处方半句;pin 自己的 docblock 写明「处方才是让拒绝可执行的那一半」⇒ 重新指向处方是执行其既定意图
main 已修掉的 本分支落后 main 16 个提交(tip aabc527cb,main 4ce14f125),期间多个 packages/types 变更落地 ⇒ 先合 main 再重测,红面目录已过期约 7 小时

⛔ 仍然不修、确实需要您裁决的

  • lookup 强制 reference —— designer 故意 PUT 半填草稿,对齐后端会 422 并阻塞该对象后续每次保存。改 designer 还是上游反对,是产品裁决。⛔ 不把该 pin 改绿(那会 pin 住已知损坏的行为)。
  • record:details section 新增 8 个键且无 designer 控件 —— 那是功能,不是对账。
  • 任何「修法会扩大/改变 objectui 已发布接受面」而非恢复 declared=enforced 的项。

#7122 保留的将只剩真正的分叉,而不是像现在这样把整片红面都挂在裁决后面。这正是我上一条该做而没做的收窄。

不变的部分

Part of #7122 保持(⛔ 不改 Fixes:#7122 仍有未裁事项,合并不得静默关闭它)。PR 仍 draft,⛔ 不入队、不挂 auto-merge。若任何修复触发条款②,PR 挂 needs:contract-review 停放。


Generated by Claude Code

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

ℹ️ Console Performance Budget — not measured

This run did not produce a console bundle to measure, so there is no pass/fail verdict for the performance budget.

This is not a budget violation. Nothing was measured — the numbers a real violation would carry are simply absent.

Step Outcome
Build packages failure
Check console performance budget skipped

See the workflow run for details.

No package size report: it is only generated from a complete package build, so a partial one is never shown.

…bjectstack/spec 17.3.0 (objectui#7122)

Three repairs, each prescribed by the thing that failed.

1. `SchemaDiffEntryKind` gained `unreachable` in 17.3.0, so app-shell's
   deliberately-total `DIFF_LABEL` map stopped compiling — TS2741, the single
   error behind the `Build packages: failure` CI reported on this branch. The
   map is total on purpose so an upstream addition fails the build instead of
   rendering a blank cell; that mechanism worked. Labelled "Not checked —
   remote unreachable", following the spec's own ruling that this kind asserts
   NOTHING about the remote schema and must never be surfaced as "schema
   changed".

2. 17.3.0 began exporting `FlowNodeLike` from `@objectstack/spec/system`, so
   app-shell's two same-named local declarations became shadows. Measured
   rather than assumed: the spec's `id?` is OPTIONAL where the inspector's is
   REQUIRED, and assignability runs one way only, so importing the spec export
   would silently widen away the guarantee `locateFlowNode`'s callers rest on.
   Genuine dialects ⇒ renamed to `InspectorFlowNode` and `ScopeFlowNode`, with
   the tripwire rows the guard asks for in `page-nav-misc-spec-parity.test.ts`.

3. The `BreakpointName` / `BreakpointColumnMap` ALLOW entries were written
   self-expiring: they covered the interval while objectstack#11027's
   retirement was merged but unreleased, and their own text said to delete them
   on the pin bump and move the names to the absence pin. 17.3.0 published the
   retirement, ratchet 3 failed them as excusing nothing, so both are deleted
   and both names are pinned absent instead.

`node scripts/check-spec-symbol-derivation.mjs` — exit 0 (was 1 with three
findings): 1345 files scanned, 18 declared dialects.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 4137.7 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-C18P77W3.js
Status FAIL

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 510.70KB 116.21KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 180.00KB 50.20KB
fields (index.js) 242.27KB 61.22KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.37KB 46.41KB
plugin-dashboard (index.js) 132.87KB 34.68KB
plugin-designer (index.js) 212.86KB 43.19KB
plugin-detail (index.js) 250.55KB 64.06KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.28KB 27.59KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.84KB 8.85KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

…the prescription (objectui#7122)

`@objectstack/spec` 17.3.0 stripped the `#NNNN` issue-number citations from its
refusal messages while keeping the prescriptive half intact. Sixteen assertions
were pinned on the stripped half and went red; each is re-pointed at what the
refusal still carries, which is the half the pins' own comments name as the
point — "the prescription is the half that makes the refusal actionable for an
author; asserting only `success === false` would stay green if it were reduced
to 'Invalid input'".

- `submitRedirect.test.ts` (13): `#7496` -> `ruled 2026-08-11`. The refusal still
  cites its governing ruling, now by date rather than by issue number; the
  key-name and non-genericity assertions are untouched.
- `export-options-spec-parity.test.ts`: `/8010|1301/` -> the surviving format
  list and the `os migrate meta` command, i.e. the actionable repair itself.
- `report-chart-query-spec-parity.test.ts`: `'#4876, ADR-0049 D2'` -> the ADR
  reference, which survived, plus the `Delete the key.` prescription.

Separately, the `PreviewModeConfig` doc-provenance ratchet FIRED and is retired
exactly as its own docblock prescribed ("correct the README line … and then
delete this guard, which has no reason to outlive the sentence it protects").
⚠️ The docblock expected that at spec major 18 — objectstack#11846 registered
the retirement in `RETIRED_DEFS_BY_MAJOR[18]` — and it arrived in a MINOR
instead, one of four public type exports 17.3.0 removed with no major signal.
The capability is untouched: `previewMode` is host-supplied and stays.

Verified: `pnpm exec vitest run` over the five affected files — 5 passed,
150 tests passed, exit 0. The edited gate script's own pin suites
(`check-spec-symbol-derivation.test.ts`, `check-doc-component-types.test.ts`) —
2 passed, 108 tests, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
…0 bump forced (objectui#7122)

The branch previously declared 'no release' with empty frontmatter, which was
true while its only diff was the lockfile. It no longer is: `@object-ui/app-shell`
needed a source fix to compile against 17.3.0 at all, and `@object-ui/auth`'s
README carried a provenance claim 17.3.0 falsified. Both are declared as patches;
the lockfile-only changeset keeps its own empty-frontmatter declaration.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
@github-actions github-actions Bot added documentation Improvements or additions to documentation plugin labels Sep 5, 2026
…ation` / `patch` (objectui#7122)

`SPEC_ACTION_KEYS` declares itself as "every property `@objectstack/spec`'s
`ActionSchema` declares", and `actionKeys.pin.test.ts` walks the schema and fails
the day that drifts. 17.3.0 added `operation` and `patch` — the declarative
single-record field write mirroring a list view's `bulkActionDefs` — so the
inventory was stating something false.

Restating the spec, NOT adopting a feature, exactly as the `description` entry
above it records for the same situation: `ActionDef` still does not declare
either key, no runner branch reads them, and no action surface forwards them.
That omission is deliberate under the maintainer's 2026-09-05 ruling on this
bump — record them as justified omissions now, forward only a key a runtime
actually reads once its semantics are read from upstream, no speculative
forwarding.

⚠️ Deliberately checked rather than assumed: the inventory feeds
`KNOWN_ACTION_KEYS`, which `classifyActionKeys` consults — and that function only
builds `unknown` / `retired` lists for a dev-mode console warning. It rejects
nothing and drops nothing, so widening it does not move what any published
`@object-ui/*` package accepts or refuses. Clause-② stays `no`.

Verified: `pnpm exec vitest run packages/core/src/actions/` — 24 files, 427
tests, exit 0. `node scripts/check-action-forward-parity.mjs` — exit 0, still
19 justified omissions / 7 known gaps, so no new gap was opened.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 4137.7 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-DFqvb1w2.js
Status FAIL

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 510.70KB 116.21KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 180.00KB 50.20KB
fields (index.js) 242.27KB 61.22KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.37KB 46.41KB
plugin-dashboard (index.js) 132.87KB 34.68KB
plugin-designer (index.js) 212.86KB 43.19KB
plugin-detail (index.js) 250.55KB 64.06KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.28KB 27.59KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.84KB 8.85KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

…al (objectui#7122)

`scripts/__tests__/doc-version-claims.test.ts` is a ratchet over version
literals on doc surfaces, and my first correction of this sentence introduced
one. Its prescription is explicit — prefer DELETING the literal and pointing at
the truth instead, because that is the only spelling that cannot go stale
(objectui#3645 froze a spec range across 36 READMEs for thirteen majors exactly
this way). The sentence now names the upstream retirement and the fact that the
resolved spec no longer exports the symbol, with no version to go stale.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 4137.7 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-DFqvb1w2.js
Status FAIL

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 510.70KB 116.21KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 180.00KB 50.20KB
fields (index.js) 242.27KB 61.22KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.37KB 46.41KB
plugin-dashboard (index.js) 132.87KB 34.68KB
plugin-designer (index.js) 212.86KB 43.19KB
plugin-detail (index.js) 250.55KB 64.06KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.28KB 27.59KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.84KB 8.85KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Rescue commit made by the PM seat after the container running the dispatched
agent was restarted mid-task. Committed so the work survives; it is NOT a
claim that it is correct or finished.

Observed state at rescue time, and nothing beyond it:
  M packages/plugin-designer/src/MetadataFieldsPage.tsx
  M packages/types/src/__tests__/export-options-spec-parity.test.ts
56 insertions / 49 deletions. No gate was run against this content.

Not present: any change to an eager-closure ceiling or performance budget.
The maintainer-authorised ceiling raise had still not been made.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3467.7 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-DY3Sc4Gn.js
Status FAIL

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 510.59KB 116.19KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 182.13KB 50.63KB
fields (index.js) 242.44KB 61.25KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.19KB 46.37KB
plugin-dashboard (index.js) 132.88KB 34.69KB
plugin-designer (index.js) 213.48KB 43.46KB
plugin-detail (index.js) 251.43KB 64.45KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.28KB 27.59KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.84KB 8.85KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

…ls on their ruling not its issue number

Two families of red from the `@objectstack/spec` 17.3.0 bump, both of which
executed an existing ruling rather than making a new one.

`manage_org_presentation` (3 assertions, `packages/fields`). 17.3.0 declares a
ninth platform capability; `CURATED_CAPABILITY_LABELS` carried eight, so the
spec-parity pin failed in the "spec added a member" direction it was built for
(objectui#6285 already ruled the curated set IS the spec's set, both ways). The
label is the spec artifact's own (`Manage Organization Presentation`), not an
invented one. Authored in all ten locale packs and in `useFieldTranslation.ts`,
which the widget's own docblock requires of any edit to that list; the nine
non-English strings are composed from each pack's established sibling
vocabulary (`manage_org_users`, `manage_platform_settings`) rather than
machine-translated, and a native review pass is welcome on them.

The `#7496` token (14 assertions, 3 files). Every one was
`expected '<message>' to contain '#7496'`, while the sibling assertions on
`RELATIVE path only` stayed green: 17.3.0 kept all five refusals and their
reasoning and only restated provenance as `(ruled 2026-08-11)`. The pins
asserted the citation FORM, not the citation — the objectui#7702 defect shape.
Re-pinned on the durable property via a documented `CITES_ITS_RULING`, which
still discriminates the spec's prose from a local hand-written sentence (the
load-bearing mutation probe in `ObjectForm.submitRedirect.test.tsx`'s header).
Not re-pinned to the new prose verbatim, which would only move the brittleness.

Part of #7122

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3468.0 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-DtiySqv1.js
Status FAIL

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 510.59KB 116.19KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 182.13KB 50.63KB
fields (index.js) 242.54KB 61.28KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.19KB 46.37KB
plugin-dashboard (index.js) 132.88KB 34.69KB
plugin-designer (index.js) 213.48KB 43.46KB
plugin-detail (index.js) 251.43KB 64.45KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.28KB 27.59KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.84KB 8.85KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

…re-derive two negative pins

The rest of the 17.3.0 red set outside the `#7496` and capability families.
Every verdict below is read off the installed artifact, not off an assertion
name or a changelog.

`registry-inputs-spec-parity` (5 assertions). Four of the five were ONE fact
wearing four assertion names, two of which appear to point in opposite
directions ("a published key must lose its entry" vs "spec no longer declares
object-grid.defaultSort"). Neither reading is right: 17.3.0 made
`object-grid.defaultSort` an ADR-0087 D2 TOMBSTONE — member is
`z.never().optional()`, description opens `[REMOVED]`, `safeParse` answers
`invalid_type` `expected: 'never'` at that path. It therefore left the
authorable set while staying listed, which is precisely how the eight
tombstones before it were harvested. Its exemption, its GA-pending entry and
its carve-out row are deleted, and the block's prose parenthetical claiming a
tombstone "would NOT make them stale here" is corrected — its own cited
counter-example, the record_picker trio, was harvested exactly that way.

The fifth emptied `OFF_SPEC_ARM_EXEMPTIONS` entirely: both arms converged
upstream in the direction their own reasons named. `element:number.filter` now
accepts `[]` and judges content at `filter.0` (objectui#6206's first option);
`object-grid.data` now answers `invalid_union` at `data.provider`, the
discriminated `ViewDataSchema` shape `ObjectGridSchema.data` already resolved
to (objectui#6207's "convergence is upstream"). Neither declaration was edited
— the contract moved to them. #6206 and #6207 are closable as resolved-upstream.

Two negative pins whose premise evaporated, both re-derived rather than
inverted:

- `masterDetailFormTypeManifest` pinned that the manifest enum does NOT make a
  value unpublishable. 17.3.0 closed that gap deliberately: `invalid_value`
  naming the honoured pair, plus a bespoke prescription for the near-miss
  `wizard` citing ADR-0001 and the renderer measurement. The pin now records
  that both authorities agree, checks each independently, keeps a positive
  control on `simple`/`tabbed`, and pins the refusal's SHAPE so "the enum
  closed" cannot be confused with a dropped key or a cross-field rule.
- `LocationField.optionalKeys` pinned that the location value schema is
  non-strict. 17.3.0 closed the shape (`unrecognized_keys` naming the retired
  `latitude`/`longitude` pair). The test carried a note for this exact event —
  "the guard could then be delegated to it" — and the re-derived answer is NO:
  the fence guards the object handed to `onChange` and no parse stands on that
  path, so strictness changed the CONSEQUENCE of a spread regression, not the
  widget's exposure. The key-level assertions stay; the strictness is pinned.

Part of #7122

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3468.0 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-DtiySqv1.js
Status FAIL

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 510.59KB 116.19KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 182.13KB 50.63KB
fields (index.js) 242.54KB 61.28KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.19KB 46.37KB
plugin-dashboard (index.js) 132.88KB 34.69KB
plugin-designer (index.js) 213.48KB 43.46KB
plugin-detail (index.js) 251.43KB 64.45KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.28KB 27.59KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.84KB 8.85KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3468.0 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-DtiySqv1.js
Status FAIL

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 510.59KB 116.19KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 182.13KB 50.63KB
fields (index.js) 242.54KB 61.28KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.19KB 46.37KB
plugin-dashboard (index.js) 132.88KB 34.69KB
plugin-designer (index.js) 213.48KB 43.46KB
plugin-detail (index.js) 251.43KB 64.45KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.28KB 27.59KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.84KB 8.85KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

…pointing

Two changesets for the work in dc82492 and e328e36: a released one for the
`manage_org_presentation` label (`@object-ui/fields`, `@object-ui/i18n`), and an
empty-frontmatter one for the test-only pin re-pointing and exemption harvest,
which releases no package.

Part of #7122

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3467.8 KB 3191.4 KB
Main entry chunk (gzip) 143.4 KB 350 KB
Entry file index-DJJLZ-aD.js
Status FAIL

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 510.59KB 116.19KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 182.13KB 50.63KB
fields (index.js) 242.54KB 61.28KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.19KB 46.37KB
plugin-dashboard (index.js) 132.88KB 34.69KB
plugin-designer (index.js) 213.48KB 43.46KB
plugin-detail (index.js) 251.43KB 64.45KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.76KB 27.75KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.84KB 8.85KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

…thorisation, to 17.3.0's measured cost

Raising a gate ceiling is a gate weakening and sits on the manual floor, so it
is a human's decision, not an agent's. The authorisation, verbatim:

    维护者 sam@objectstack.ai 于本轮明确授权:「抬上限,把 7685 弄绿」

recorded on objectui#7122 as decision batch 1 item 1 = "B + A" — a one-time,
cause-recorded adjustment of exactly the measured delta, with the upstream card
filed alongside.

⛔ NOT routine growth, and the body must not read as if it were. The residue is
`@objectstack/spec` 17.3.0's own browser-dist growth: +292.2 KB gzip on the spec
package, whose measured mechanism is that 17.3.0 lengthened the Zod
`.describe()` doc strings shipped in the browser build — authoring
documentation prose, delivered on every page load.

⛔ NOT duplication either. That was the larger, separate problem and this branch
already fixed it by moving the `@objectstack/*` family together in the lockfile:
−671 KB, with markers unique to 17.2.0 falling from 92.3% to 1.0% of 104 and the
single survivor accounted for. No chunk entered or left the closure.

⭐ The honest long-term fix is upstream and this ceiling is its marker, not its
answer: a `describe()`-stripped browser build returns ~292 KB to EVERY consumer
of the spec. Filed as objectstack#16063 and recorded in the gate as the restore
condition.

Four constants, two ceiling/baseline pairs, measured by `pnpm build` (exit 0,
43/43 — 43/43 CACHED on the re-read, which observes rather than argues the
"nothing here reaches the bundler" invariant) reading
apps/console/dist/eager-closure.json on 34a1578:

  MAX_EAGER_CLOSURE_GZIP_BYTES              3_268_000 -> 3_597_000
  BASELINE                                  3_222_314 -> 3_551_191 (48/517 -> 50/518)
  PER_CHUNK_GZIP_CEILINGS.vendor-objectstack  967_000 -> 1_254_000
  PER_CHUNK_BASELINE.vendor-objectstack       948_461 -> 1_235_029

Headroom is 45,809 (0.50x) and 18,971 (0.21x) of the 91,136-byte regression the
gate exists to catch — the proportions the retiring pairs carried (0.50x, 0.20x)
— so the gate still reds on a repeat of objectui#5266. `check:eager-closure`
exits 0 with sensitivity ✅ on all five ceilings. The three per-chunk lines that
still pass (i18n-locales, framework, ui-components) were NOT touched.

The unit test moves with the constants because it deliberately retypes
`BASELINE.gzipBytes` rendered (3146.8 -> 3468.0) rather than deriving it, and
the baseline prose pins are re-pointed at the new commit.

Part of #7122

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3467.8 KB 3512.7 KB
Main entry chunk (gzip) 143.4 KB 350 KB
Entry file index-DJJLZ-aD.js
Status PASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 510.59KB 116.19KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 182.13KB 50.63KB
fields (index.js) 242.54KB 61.28KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.19KB 46.37KB
plugin-dashboard (index.js) 132.88KB 34.69KB
plugin-designer (index.js) 213.48KB 43.46KB
plugin-detail (index.js) 251.43KB 64.45KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.76KB 27.75KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.84KB 8.85KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

os-sam commented Sep 6, 2026

Copy link
Copy Markdown
Collaborator

PM review — green at 901c4b867, and the raise checks out

All 32 checks read by name on the actual head: 29 success, 3 skipped (Test (coverage) ×2, dependabot), 0 failures, 0 in flight. Four test shards, Type Check, Lint, Bundle Analysis, Build & E2E all ✅.

The ceiling raise, re-derived rather than accepted

The number I care about is not the ceiling, it is the headroom — a ceiling raised past the regression it is meant to catch is decorative, and this file says so itself. Recomputed from the diff:

pair ceiling baseline headroom ×REGRESSION_THIS_GATE_MUST_CATCH_BYTES
aggregate 3,597,000 3,551,191 45,809 0.503×
vendor-objectstack 1,254,000 1,235,029 18,971 0.208×

Both land on the file's own retiring precedent (0.501× and ~0.20×), not on a number chosen to fit. The ceiling covers the measured 3467.8 KB = 3,551,027 bytes with the drift margin CI needs, since CI weighs the merge ref and no local tree can equal it.

The sensitivity guard was not touched. This was the specific thing I withheld sign-off for. The diff to scripts/__tests__/check-eager-closure-budget.test.ts is 7 lines; it('is exactly one regression wide, from either side of the line') is unmodified. What moved is two rendered literals of BASELINE.gzipBytes — the kind that must move when a baseline moves — and the comment records the direction without euphemism: "objectui#6683 down to 3177.7, objectui#6776 down to 3146.8, objectui#7122 UP to 3468.0 on the authorised raise". First upward move in that list, labelled as one.

BASELINE.commit: '34a1578ef' holds: the final commit touches three files (.mjs, its test, a changeset) and none reach the bundler, so the "differs only by this file" argument the constant depends on is still true.

What the raise is buying — stated so it is not misread later

⛔ Not a regression this branch introduced, and ⛔ not duplication. The duplication was already paid off by the family bump (−671 KB; 17.2.0-unique markers 92.3% → 1.0%). The residue is @objectstack/spec 17.3.0's own browser-dist growth — longer Zod .describe() doc strings shipping in the browser build. It is a cost this repo cannot pay from inside, recorded under the maintainer's explicit instruction 「抬上限,把 7685 弄绿」. Whether spec's browser build should carry authoring prose at all is the upstream question this hands back.

Also worth keeping visible: the earlier catalogue of "8 assertions / 6 files" was measured with --project unit, a subset of what CI shards. The true set was 24 assertions / 7 files, all four families now closed. A measurement narrower than the gate is not a reading of the gate.

⛔ Two things block landing, and neither is mine to decide

  1. The lookup-guard hunks are Designer PUTs half-filled lookup drafts that @objectstack/spec 17.3.0 refuses (reference is now required) — keep the draft client-side and do not PUT it (#7122 ruling, item 4 = A) #7714's by the 2026-09-05T23:00Z ruling (item 4/A1), and they are on this branch. They arrived through a PM rescue commit (9c1a1ac5f) when an agent died mid-task, not through a dispatch. They are in exactly one place today, so "must not be in both places" is not yet violated; they are gated and verified here; and removing them would destroy a verified fix, restore a known-broken save path, and put this PR back to red — the opposite of the instruction that produced it. Keeping them looks right on the merits, but closing Designer PUTs half-filled lookup drafts that @objectstack/spec 17.3.0 refuses (reference is now required) — keep the draft client-side and do not PUT it (#7122 ruling, item 4 = A) #7714 as delivered-here allocates scope to another lane's card and needs its owner. Flagged on Designer PUTs half-filled lookup drafts that @objectstack/spec 17.3.0 refuses (reference is now required) — keep the draft client-side and do not PUT it (#7122 ruling, item 4 = A) #7714.
  2. needs:contract-review is still owed, and correctly so. Section 10's old blanket claim was wrong as written: no repair here changes what any @object-ui/* package accepts or refuses, but the bump does — @object-ui/console now rejects an object-master-detail-form.formType value 17.2.0 accepted, and object-grid.defaultSort left the contract as an ADR-0087 D2 tombstone. That is an accept/reject change inherited from spec, and it is what the label is for.

Left draft, not enqueued, auto-merge unarmed. Green is not the same as landable, and the gap is these two decisions.

Two smaller items for whoever picks this up: objectui#6206 and objectui#6207 both look closable as resolved-upstream (17.3.0 moved to each one's own stated reason, and their exemptions are now deleted); and three per-chunk ceilings are passing but tight and were deliberately not raised — framework 68,550/71,000, ui-components 394,968/399,000, i18n-locales 449,305/455,000, of which this PR's ten capability labels cost +141 bytes.


Generated by Claude Code

os-sam commented Sep 6, 2026

Copy link
Copy Markdown
Collaborator

Correction to my review above — two claims in it were wrong, and the numbering was stale

The tier contract review has run (maintainer-authorised, fable). It corrects my comment 5556211864 on three points, and I'd rather retract them here than let them stand as the record.

1. "Content that used to publish through @object-ui/console now fails" — ungrounded, and I should not have written it. I inferred a product consequence from a test pin without checking that a product path existed. There isn't one, measured three ways: no non-test objectui code parses through ComponentPropsMap or ObjectMasterDetailFormPropsSchema (grep across packages/*/src, apps/console/src, zero call sites); the Studio save gate (ResourceEditPage.tsx:585validateMetadataDraftclientValidation.ts:622 PageSchema) does not validate block properties at all — it accepts formType: 'wizzard' and even object-grid.nonsenseKey on both spec versions; and objectui's own authoring gate already refused wizzard as invalid-enum before this PR (objectui#5939). The spec's boundary moved; objectui's did not. ⇒ contract-neutral for objectui, and the re-derived pin is right.

2. manage_org_presentation "becomes selectable in the UI" — wrong premise. The picker's options come from the server: CapabilityMultiSelectField.tsx fetches sys_capability rows and unions the already-selected names. CURATED_CAPABILITY_LABELS is consulted only in labelFor. This PR changes a label, not an option. ⇒ contract-neutral, and squarely the execution of objectui#6285.

3. I referred to "section 10". The body has sections 1–8; the clause-② section is §6. My numbering came from a superseded revision.

What the review found that I missed

Being wrong in that direction did not make the PR cleaner — it made me miss four real clause-② items, and the strongest one has a defect:

  • The lookup guard diverges from the contract. MetadataService.ts:255 and MetadataFieldsPage.tsx:238 test reference.trim() !== '', but the spec accepts a whitespace-only reference (measured, field level and ObjectSchema level). Objectui refusing it is a locally authored refusal beyond the contract. Being fixed by declaring it deliberate rather than dropping it — a whitespace-only reference names no object, so admitting it only moves the failure somewhere worse — but it stops being silent. The message also says the field "has none" for non-string values the spec refuses as invalid_type; that wording is being corrected too.
  • @object-ui/components registerPlaceholders() no longer registers user:profile, so a page naming it renders the "Unknown component type" panel — an objectui-authored accept→refuse at the render surface. With it, the Studio save gate now refuses such a page outright (custom@regions.0.components.0.type; 17.2.0 accepted it). This is the one inherited narrowing that does have a product path.
  • @object-ui/cli objectui check now warns on user:profile (exit code unchanged) — diagnostic narrowing.
  • @object-ui/core SPEC_ACTION_KEYS gains operation/patch (exported; feeds classifyActionKeys), and @object-ui/types ObjectSchemaClientExtensions narrows to Record<never, never>. Both are yes on the surface limb under the mechanical floor, however small.

Also: consumers on ^17.x already resolve spec 17.3.0 (npm latest since 2026-09-04). The lockfile bump introduces the inherited narrowings to this repo's console build and test corpus, not to consumers — §6 implied otherwise.

Verdict

needs:contract-review is not dischargeable as it stands. No revert needed. In flight now: the guard predicate declared (or aligned), the patchminor grades on app-shell / plugin-designer / types per AGENTS.md:239 with breaking semantics stated, §6 replaced with the reviewer's wording, and two pin-quality nits (CITES_ITS_RULING's #\d{3,} alternative matches this repo's own messages, so only (ruled YYYY-MM-DD) discriminates; and one file pins the literal where three use the regex).

The ownership question from ruling A1 (#7714) is unchanged and still not a review outcome.

One upstream finding worth a card: @objectstack/spec accepting a whitespace-only reference on lookup/master_detail looks like a gap that objectui is compensating for.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants